package algo3.modelo;

import java.util.ArrayList;
import java.util.Iterator;

import algo3.modelo.armas.Arma;
import algo3.modelo.armas.Danio;
import algo3.modelo.barcos.Barco;
import fiuba.algo3.titiritero.modelo.ObjetoVivo;

public class Juego implements IModificablePorTurnos, ObjetoVivo {
	
	private ArrayList<Barco> barcos = new ArrayList<Barco>();
	private ArrayList<Arma> armas = new ArrayList<Arma>();
	private Tablero tablero;
	
	public ArrayList<Barco> getBarcos(){
		return this.barcos;
	}
	
	public Juego(int columnas,int filas){
		this.tablero = new Tablero(columnas, filas);
	}


	public void agregarBarco(Barco barco){
		this.barcos.add(barco);
	}

	public void agregarArma(Arma arma){
		this.armas.add(arma);
	}

	
	public void avanzarTurno() {

		this.realizarAccionesDeAtaque();

		Iterator<Barco> iter = this.barcos.iterator();
		while (iter.hasNext()) {
		    if (iter.next().getEstado() == Barco.Estado.HUNDIDO) {
		        iter.remove();
		    }
		}
		
		for(Arma arma: this.armas){
			arma.avanzarTurno();
		}
		
		this.colisionarBarcosConBordesDelTablero();

		for(Barco barco: this.barcos){
			barco.avanzarTurno();
		}
		
	}
	
	public void colisionarBarcosConBordesDelTablero() {
		for(Barco barco: barcos) {
			for (Posicion pos: barco.posicionesOcupadas()){
				if (tablero.posicionEnBorde(pos)){
					barco.invertirDireccion();
					break;
				}
			}
			
		}		
	}

	public void realizarAccionesDeAtaque() {
		Juego.colisionarBarcosConArmas(this.barcos, this.armas);
		Juego.daniarBarcos(this.barcos, this.armas);
	}
	
	static public void colisionarBarcosConArmas(ArrayList<Barco> barcos, ArrayList<Arma> armas){
		for(Arma arma: armas) {
			for(Barco barco: barcos) {
				arma.recibeImpactoDe(barco);
			}
		}
	}

	static public void daniarBarcos(ArrayList<Barco> barcos, ArrayList<Arma> armas){
		for(Arma arma: armas){
			ArrayList<Danio> danios = arma.getListaDeDanios();
			for(Danio danio: danios){
				for(Barco barco: barcos){
					barco.recibirDanio(danio);
				}
			}
		}
	}

	@Override
	public void vivir() {
		this.avanzarTurno();
	}
}
